import { BaseRenderer } from "./base_renderer.mjs";
import { render_property } from "../renderers.mjs";

/**
 * 对象渲染器
 * 处理对象类型的渲染
 */
export class ObjectRenderer extends BaseRenderer {
  /**
   * 渲染对象
   * @param {Object} params - 渲染参数
   * @param {HTMLElement} params.container - 容器元素
   * @param {Object} params.schema - Schema定义
   * @param {*} params.data - 对象数据
   * @param {string} params.mode - 显示模式
   */
  static render({ container, schema, data, mode }) {
    const el = document.createElement("json_object");
    container.appendChild(el);
    el.path = container.path || "";
    el.thin_data = data;

    this.renderHeader(el, schema);
    this.renderProperties(el, schema, data, mode);
  }

  /**
   * 渲染对象头部（标题和描述）
   * @param {HTMLElement} container - 容器元素
   * @param {Object} schema - Schema定义
   */
  static renderHeader(container, schema) {
    if (schema.title || schema.description) {
      container.innerHTML = `
        ${schema.title ? `<h2>${schema.title}</h2>` : ""}
        ${
          schema.description
            ? `<div class="description">${schema.description}</div>`
            : ""
        }
      `;
    }
  }

  /**
   * 渲染对象属性
   * @param {HTMLElement} container - 容器元素
   * @param {Object} schema - Schema定义
   * @param {*} data - 对象数据
   * @param {string} mode - 显示模式
   */
  static renderProperties(container, schema, data, mode) {
    if (schema.type === "object" && schema.properties) {
      Object.entries(schema.properties).forEach(
        ([propertyName, propertySchema]) => {
          render_property({
            container,
            schema: {
              ...propertySchema,
              name: propertyName,
              path: container.path
                ? `${container.path}.${propertyName}`
                : propertyName,
            },
            data: data?.[propertyName],
            mode,
          });
        }
      );
    } else {
      render_property({ container, schema, data, mode });
    }
  }
}
